﻿Imports FireAndIceSoft.dbFireAndIceDataSetTableAdapters
Imports System.Security.Cryptography
Imports System.Collections
Imports System.Resources

Public Class SeguridadSGS

    ''' <summary>
    ''' Funcion que restaura los valores por defecto de la seguridad del Sistema
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Shared Function RestaurarValoresPorDefecto() As Boolean
        Try
            Dim opcion As Integer
            opcion = MsgBox("Esta restauración eliminará los permisos existentes en el Sistema y los volverá a registrar a partir del archivo (SeguridadSGS) así mismo eliminará todos los privilegios asignados a los roles exceptuando al rol de Administrador, ¿Está seguro que desea continuar?", MsgBoxStyle.YesNo + MsgBoxStyle.Question, "Restaurar valores por defecto")
            If opcion = vbYes Then
                Using adaptadorRolDetalle As New seg_roldetalleTableAdapter
                    adaptadorRolDetalle.DeleteQueryAll()
                    Using adaptadorPermisos As New seg_clasesTableAdapter
                        adaptadorPermisos.DeleteQueryAll()
                    End Using
                End Using
                If AgregarPermisosFromRecursoToBD() = False Then
                    MsgBox("No se encontró el archivo de permisos (SeguridadSGS) en la carpeta raíz, a continuación se mostrará una ventana para que cargue el archivo y luego registre los permisos al Sistema", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "Error restaurando los valores por defecto")
                    CargarArchivoSeguridad.ShowDialog()
                Else
                    DarTodosLosPermisosAlAdministrador()
                    MsgBox("Se restauraron los valores por defecto con éxito", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "Valores por defecto")
                End If
            End If
        Catch ex As Exception
            MsgBox("No se restauraron los valores por defecto", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "Error restaurando los valores por defecto")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgVinicio, "Error en la clase SeguridadSGS al restaurar los valores por defecto", ex, My.Resources.StringGlobal.mdlSeguridad, "SeguridadSGS", "RestaurarValoresPorDefecto")
            Return False
        End Try

        Return True
    End Function

    ''' <summary>
    ''' Metodo que busca en los recursos SeguridadSGS los permisos y los agrega a la base de datos en caso de no existir
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Shared Function AgregarPermisosFromRecursoToBD() As Boolean
        Try
            Dim dirRecurso As String = "..\..\Resources\SeguridadSGS.resx"
            Dim rsxr As ResXResourceReader
            If My.Computer.FileSystem.FileExists(dirRecurso) Then
                rsxr = New ResXResourceReader(dirRecurso)
            Else
                rsxr = New ResXResourceReader("SeguridadSGS.resx")
            End If

            Dim d As DictionaryEntry
            Dim contador As Integer
            Using adaptadorPermisos As New seg_clasesTableAdapter
                For Each d In rsxr
                    'Dim vKey As String = d.Key
                    Dim vValue As String = d.Value
                    Dim vComen As String = "Permiso para gestionar " + d.Value
                    contador = 0
                    For Each item In adaptadorPermisos.GetData
                        If item.idclase.Trim = vValue.Trim Then
                            contador = contador + 1
                        End If
                    Next
                    If contador = 0 Then
                        adaptadorPermisos.InsertQuery(vValue, vValue, vComen)
                    End If
                Next
            End Using
        Catch ex As Exception
            'LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgVinicio, "Error en la clase SeguridadSGS al agregar los permisos del recurso a la BD", ex, My.Resources.StringGlobal.mdlSeguridad, "SeguridadSGS", "AgregarPermisosFromRecursoToBD")
            Return False
        End Try
        Return True
    End Function

    ''' <summary>
    ''' Función para dar todos los permisos registrados en el Sistema al administrador
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Shared Function DarTodosLosPermisosAlAdministrador()
        AgregarPermisosFromRecursoToBD()
        Try
            Using adaptador As New seg_clasesTableAdapter()
                Using adaptadorRolDetalle As New seg_roldetalleTableAdapter
                    For Each item In adaptador.GetData
                        adaptadorRolDetalle.Delete(1, item.idclase)
                        adaptadorRolDetalle.InsertQuery(1, item.idclase)
                    Next
                End Using
            End Using
        Catch ex As Exception
            Using logAdaptador As New tlogTableAdapter()
                logAdaptador.InsertQueryLogs(logAdaptador.ScalarQueryCountLogs + 1, My.Forms.MDI.Iduser.Caption, My.Resources.StringGlobal.prgVinicio, "Error en la clase de seguridad y en el metodo: DarTodosLosPermisosAlAdministrador", ex.Message, My.Resources.StringGlobal.mdlMensajes, Date.Today, TimeOfDay.TimeOfDay.ToString, My.Computer.Name, "SeguridadSGS", "DarTodosLosPermisosAlAdministrador")
            End Using
        End Try
        Return 0
    End Function

    ''' <summary>
    ''' Funcion que verifica las credenciales del Usuario
    ''' </summary>
    ''' <param name="contrasena">Recibe la contraseña del Usuario</param>
    ''' <param name="usuario">Recibe el nombre del Usuario</param>
    ''' <returns>Retorna (true) si sus credenciales son correctas de lo contrario retorna (false)</returns>
    ''' <remarks></remarks>
    Shared Function VerificaCredenciales(ByVal contrasena As String, ByVal usuario As String) As Boolean
        Try
            Dim verificacontra As String = EncriptarContrasenaMD5(String.Format("{0}jova889", contrasena.Trim))
            Dim verificauser As String = usuario.Trim
            Using usuariosAdaptador As New usuariosTableAdapter()
                Dim bduser As Integer = usuariosAdaptador.ScalarQueryConsultaUser(verificauser)
                Dim bdcontra As String = usuariosAdaptador.ScalarQueryConsultaContra(verificauser)
                If bduser = 1 And verificacontra = bdcontra Then
                    Return True
                End If
            End Using
        Catch ex As Exception
            Using logAdaptador As New tlogTableAdapter()
                logAdaptador.InsertQueryLogs(logAdaptador.ScalarQueryCountLogs + 1, My.Forms.MDI.Iduser.Caption, My.Resources.StringGlobal.prgVinicio, "Error en la clase de seguridad y en el metodo MD5EncryptPass", ex.Message, My.Resources.StringGlobal.mdlMensajes, Date.Today, TimeOfDay.TimeOfDay.ToString, My.Computer.Name, "SeguridadSGS", "MD5EncryptPass")
            End Using
        End Try
        Return False
    End Function


    ''' <summary>
    ''' Funcion que encripta la contraseña a MD5
    ''' </summary>
    ''' <param name="StrPass">Recibe la contraseña</param>
    ''' <returns>Retorna la contraseña en MD5</returns>
    ''' <remarks></remarks>
    Shared Function EncriptarContrasenaMD5(ByVal StrPass As String) As String
        Try
            Dim PasConMd5 As String = ""
            Using md5 As New MD5CryptoServiceProvider()
                Dim bytValue As Byte() = System.Text.Encoding.UTF8.GetBytes(StrPass)
                Dim bytHash As Byte() = md5.ComputeHash(bytValue)
                Dim i As Integer
                md5.Clear()
                For i = 0 To bytHash.Length - 1
                    PasConMd5 &= bytHash(i).ToString("x").PadLeft(2, "0")
                Next
            End Using
            Return PasConMd5
        Catch ex As Exception
            Using logAdaptador As New tlogTableAdapter()
                logAdaptador.InsertQueryLogs(logAdaptador.ScalarQueryCountLogs + 1, My.Forms.MDI.Iduser.Caption, My.Resources.StringGlobal.prgVinicio, "Error en la clase de seguridad y en el metodo MD5EncryptPass", ex.Message, My.Resources.StringGlobal.mdlMensajes, Date.Today, TimeOfDay.TimeOfDay.ToString, My.Computer.Name, "SeguridadSGS", "MD5EncryptPass")
            End Using
        End Try
        Return Nothing
    End Function

    ''' <summary>
    ''' Metodo para para gestionar los permisos del usuario logueado
    ''' </summary>
    ''' <param name="permiso">Recibe el nombre del permiso</param>
    ''' <param name="control">Recibe el nombre del control (BarButtonItem) que se tiene que bloquear o desbloquear segun el rol</param>
    ''' <remarks></remarks>
    Shared Function Permisos(ByVal permiso As String, ByRef control As DevExpress.XtraBars.BarButtonItem) As Boolean
        Try
            Dim varIdUser As Integer = My.Forms.MDI.Iduser.Caption
            Dim varIdRol As Integer = My.Forms.MDI.Idrol.Caption
            Using adaptador As New seg_vseguridadclasesTableAdapter()
                If (adaptador.ScalarQueryTienePermisoClases(varIdUser, varIdRol, permiso) <> 0) Then
                    control.Enabled = True
                    Return True
                End If
            End Using
        Catch ex As Exception
            Using logAdaptador As New tlogTableAdapter()
                logAdaptador.InsertQueryLogs(logAdaptador.ScalarQueryCountLogs + 1, My.Forms.MDI.Iduser.Caption, My.Resources.StringGlobal.prgVinicio, "Error en la clase de seguridad y en el metodo permisos donde tipo de control es (BarButtonItem)", ex.Message, My.Resources.StringGlobal.mdlMensajes, Date.Today, TimeOfDay.TimeOfDay.ToString, My.Computer.Name, "SeguridadSGS", "Permisos.BarButtonItem")
            End Using
        End Try
        control.Enabled = False
        Return False
    End Function

    ''' <summary>
    ''' Metodo para para gestionar los permisos del usuario logueado
    ''' </summary>
    ''' <param name="permiso">Recibe el nombre del permiso</param>
    ''' <param name="control">Recibe el nombre del control (SimpleButton) que se tiene que bloquear o desbloquear segun el rol</param>
    ''' <remarks></remarks>
    Shared Function Permisos(ByVal permiso As String, ByRef control As DevExpress.XtraEditors.SimpleButton) As Boolean
        Try
            Dim varIdUser As Integer = My.Forms.MDI.Iduser.Caption
            Dim varIdRol As Integer = My.Forms.MDI.Idrol.Caption
            Using adaptador As New seg_vseguridadclasesTableAdapter()
                If (adaptador.ScalarQueryTienePermisoClases(varIdUser, varIdRol, permiso) <> 0) Then
                    control.Enabled = True
                    Return True
                End If
            End Using
        Catch ex As Exception
            Using logAdaptador As New tlogTableAdapter()
                logAdaptador.InsertQueryLogs(logAdaptador.ScalarQueryCountLogs + 1, My.Forms.MDI.Iduser.Caption, My.Resources.StringGlobal.prgVinicio, "Error en la clase de seguridad y en el metodo permisos donde tipo de control es (button)", ex.Message, My.Resources.StringGlobal.mdlMensajes, Date.Today, TimeOfDay.TimeOfDay.ToString, My.Computer.Name, "SeguridadSGS", "Permisos.SimpleButton")
            End Using
        End Try
        control.Enabled = False
        Return False
    End Function

    ''' <summary>
    ''' Metodo para para gestionar los permisos de un usuario especifico
    ''' </summary>
    ''' <param name="permiso">Recibe el nombre del permiso</param>
    ''' <param name="usuario">Recibe el nombre del usuario a evaluar sus permisos</param>
    ''' <param name="contrasena">Recibe la contrasena del usuario a evaluar sus permisos</param>
    ''' <returns>Retorna (true) si el Usuario tiene permisos de lo contrario retorna (false)</returns>
    ''' <remarks></remarks>
    Shared Function PermisosPorUsuario(ByVal permiso As String, ByVal usuario As String, ByVal contrasena As String) As Boolean
        Try
            If VerificaCredenciales(contrasena, usuario) Then
                Using AdaptadorUsuario As New usuariosTableAdapter()
                    Dim varIdRol As Integer = AdaptadorUsuario.ScalarQueryConsultaRol(usuario)
                    Dim varIdUsuario As Integer = AdaptadorUsuario.ScalarQueryConsultaIdIser(usuario)
                    Using adaptador As New seg_vseguridadclasesTableAdapter
                        Return If(adaptador.ScalarQueryTienePermisoClases(varIdUsuario, varIdRol, CStr(permiso)) <> 0, True, False)
                    End Using
                End Using
            End If
        Catch ex As Exception
            Using logAdaptador As New tlogTableAdapter()
                logAdaptador.InsertQueryLogs(logAdaptador.ScalarQueryCountLogs + 1, My.Forms.MDI.Iduser.Caption, My.Resources.StringGlobal.prgVinicio, "Error en la clase de seguridad y en el metodo permisos por usuario", ex.Message, My.Resources.StringGlobal.mdlMensajes, Date.Today, TimeOfDay.TimeOfDay.ToString, My.Computer.Name, "SeguridadSGS", "PermisosPorUsuario")
            End Using
        End Try
        Return False
    End Function


    Shared Function PermisosControlesBasicos()




        Return 0
    End Function
End Class
